package com.lh.utils;

import com.lh.entity.table.RectificationInfo;
import com.lh.entity.table.TreeNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RectificationByDepartmentClassifier {

    // 部门清单
    private final static List<String> DEPARTMENTS = RectificationClassifier.DEPARTMENTS;

    /**
     * 将RectificationInfo列表转换为按部门+三级分类的四层树状结构
     * 支持不完整层级，即使某些层级为null也能正确统计
     * @param rectificationInfoList 原始数据列表
     * @return 四层树状结构列表
     */
    public static List<TreeNode> classifyByDepartment(List<RectificationInfo> rectificationInfoList) {
        // 根节点列表，即各部门
        List<TreeNode> rootNodes = new ArrayList<>();

        // 初始化所有部门节点
        initializeAllDepartments(rootNodes);

        if (rectificationInfoList == null || rectificationInfoList.isEmpty()) {
            return rootNodes;
        }

        for (RectificationInfo info : rectificationInfoList) {
            // 获取部门名称
            String departmentName = info.getDepartmentName();

            // 只处理在指定部门列表中的数据
            if (departmentName == null || !DEPARTMENTS.contains(departmentName)) {
                continue;
            }

            // 获取各级分类值，允许部分为null
            String level2 = info.getProjectType();       // 原一级变为二级
            String level3 = info.getProjectChildType();  // 原二级变为三级
            String level4 = info.getProjectChildCategoryType();  // 原三级变为四级

            // 查找部门节点（一级节点）
            TreeNode deptNode = findNode(rootNodes, departmentName);
            if (deptNode != null) {
                deptNode.incrementCount();

                // 处理二级节点（允许为null，但不为null时才创建）
                if (level2 != null) {
                    TreeNode level2Node = findOrCreateNode(deptNode.getChildren(), level2, 2);
                    level2Node.incrementCount();

                    // 处理三级节点（允许为null，但不为null时才创建）
                    if (level3 != null) {
                        TreeNode level3Node = findOrCreateNode(level2Node.getChildren(), level3, 3);
                        level3Node.incrementCount();

                        // 处理四级节点（允许为null，但不为null时才创建）
                        if (level4 != null) {
                            TreeNode level4Node = findOrCreateNode(level3Node.getChildren(), level4, 4);
                            level4Node.incrementCount();
                        }
                    }
                }
            }
        }

        return rootNodes;
    }

    /**
     * 初始化所有部门节点
     */
    private static void initializeAllDepartments(List<TreeNode> rootNodes) {
        for (String dept : DEPARTMENTS) {
            rootNodes.add(new TreeNode(dept, dept, 1));
        }
    }

    /**
     * 在节点列表中查找指定key的节点
     * @param nodes 节点列表
     * @param key 节点key
     * @return 找到的节点，若不存在则返回null
     */
    private static TreeNode findNode(List<TreeNode> nodes, String key) {
        for (TreeNode node : nodes) {
            if (key != null && key.equals(node.getKey())) {
                return node;
            }
        }
        return null;
    }

    /**
     * 在节点列表中查找指定key的节点，如果不存在则创建新节点
     * @param nodes 节点列表
     * @param key 节点key
     * @param level 节点级别
     * @return 找到的或新创建的节点
     */
    private static TreeNode findOrCreateNode(List<TreeNode> nodes, String key, int level) {
        for (TreeNode node : nodes) {
            if (key.equals(node.getKey())) {
                return node;
            }
        }

        // 如果找不到则创建新节点并添加到列表
        TreeNode newNode = new TreeNode(key, key, level);
        nodes.add(newNode);
        return newNode;
    }
}

